package utilx

import (
	"reflect"
	"regexp"

	"github.com/gin-gonic/gin"
)

// AutoLoad 自动加载
func AutoLoad(ptr any, re string, ps ...any) {
	typ := reflect.TypeOf(ptr)
	val := reflect.ValueOf(ptr)
	if val.Elem().Kind() != reflect.Struct {
		panic("参数必须是一个结构体: " + typ.Elem().Name())
	}

	params := make([]reflect.Value, 0)
	for _, p := range ps {
		params = append(params, reflect.ValueOf(p))
	}

	reg := regexp.MustCompile(re)
	for i := 0; i < typ.NumMethod(); i++ {
		if reg.Match([]byte(typ.Method(i).Name)) {
			val.Method(i).Call(params)
		}
	}
}

// LoadComponent 自动加载组件
func LoadComponents(component any) {
	AutoLoad(component, `^Add(.+)Component$`)
}

// LoadRouter 自动加载路由
func LoadRouters(router any, group *gin.RouterGroup) {
	AutoLoad(router, `^Bind(.+)Handler$`, group)
}
